const CryptoJS = require('crypto-js');
import { Base64 } from 'js-base64';
import { JSEncrypt } from 'wxmp-rsa';
/**
 * @class AES+RSA加密封装
 */
export class Encrypt {
  private Key: string;
  constructor() {
    this.Key = this.getKey(16); // 生成16位AES密钥
  }
  
  /**
   * @function 生成AES密钥
   */
  private getKey = (digits: number): string => {
    const key = [];
    for(let i = 0; i < digits; ++i) {
      const num = Math.floor(Math.random() * 26); 
      const char = String.fromCharCode(97 + num); // 获取单个字符
      key.push(char.toLowerCase()); // 转换为小写字母
    }
    return key.join('');
  }
  /**
   * @function AES加密
   * 转Utf8编码: CryptoJS.enc.Utf8.parse();
   * 转Base64: CryptoJS.enc.Base64.stringify();
   * @param data 需要加密的数据
   * @param key 密钥
   * @returns 加密后的数据
   */
  public encryptAES = (data: string | object): string => {
    if(typeof data == 'object') {
      data = JSON.stringify(data);
    }
    // 统一将传入的字符串转成UTF8编码后用base64编码
    const dataHex = Base64.encode(data); // 需要加密的数据
    const keyHex = CryptoJS.enc.Utf8.parse(this.Key); // 秘钥
    const result = CryptoJS.AES.encrypt(dataHex, keyHex, {
      mode: CryptoJS.mode.ECB, // 加密方式 AES-128-ECB Pkcs7
      padding: CryptoJS.pad.Pkcs7,
    })
    // base64转码
    const encodedResult = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(result.toString()));
    return encodedResult;
  }

  /**
   * @function RSA加密字符串
   * @param data 要加密的数据
   * @param key RSA公钥
   */
  public encodeRSA = ( key: string, data: string = this.Key): string => {
    const encryptTool = new JSEncrypt();
    encryptTool.setPublicKey(key); // 设置公钥
    const result = encryptTool.encrypt(Base64.encode(data)); // AES Key在RSA加密前要进行base64编码
    return result;
  }
}